import os,sys
from flask import Blueprint, Flask, jsonify, send_from_directory, request
from werkzeug.utils import secure_filename
from hashlib import md5
from exts import cache


# 将项目根目录添加到Python路
# 将项目根目录添加到 sys.path
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import config

# 创建一个名为 'image' 的蓝图对象
image = Blueprint('image', __name__, url_prefix='/')

# 允许上传的文件格式
ALLOWED_EXTENSIONS = {'jpg', 'jpeg', 'png'}

# 文件大小限制为 500KB
MAX_FILE_SIZE = 500 * 1024  # 500KB

def allowed_file(filename):
    """检查文件扩展名是否允许"""
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

def get_file_md5(file):
    """计算文件的 MD5 哈希值"""
    hash_md5 = md5()
    for chunk in iter(lambda: file.read(4096), b""):
        hash_md5.update(chunk)
    file.seek(0)  # 重置文件指针到文件开头
    return hash_md5.hexdigest()

@image.route('/images/<filename>')
def get_image(filename):
    """获取图片"""
    # print(config.UPLOAD_FOLDER)
    image_dir = config.UPLOAD_FOLDER
    full_path = os.path.join(image_dir, filename)

    if os.path.exists(full_path):
        return send_from_directory(image_dir, filename)
    else:
        # 如果请求的图像不存在，返回指定的图片（这里假设指定图片名为default.jpg）
        return send_from_directory(image_dir, 'default.jpg')

@image.route('/image/upload', methods=['POST'])
def upload_image():
    # print('上传图片')
    """上传图片"""
    if 'file' not in request.files:
        return jsonify({'error': '文件不存在'}), 400

    file = request.files['file']
    print(file.filename)
    if file.filename == '':
        return jsonify({'error': '未选择文件'}), 400

    if not allowed_file(file.filename):
        return jsonify({'error': '不允许的文件类型。仅允许 JPG 和 PNG 格式。'}), 400

    # 检查文件大小
    file.seek(0, os.SEEK_END)
    file_length = file.tell()
    file.seek(0)  # 重置文件指针到文件开头

    if file_length > MAX_FILE_SIZE:
        return jsonify({'error': '文件大小超过了500KB的最大限制。'}), 400

    # 计算文件的 MD5 哈希值作为新的文件名
    file_md5 = get_file_md5(file)
    file_ext = file.filename.rsplit('.', 1)[1].lower()
    new_filename = f"{file_md5}.{file_ext}"

    # 保存文件
    upload_folder = config.UPLOAD_FOLDER
    if not os.path.exists(upload_folder):
        os.makedirs(upload_folder)

    file_path = os.path.join(upload_folder, new_filename)
    file.save(file_path)

    # 返回图片的访问链接
    image_url = f"{new_filename}"
    return jsonify({'url': image_url,'msg':'图片上传成功'}), 200